{
    /*有序不重复的集合*/
    let setMap = new Set([1, 2, 3, 4]);//创建
    setMap.add(5);//添加
    console.log(setMap.size);//5
    console.log(setMap);//有序输出
    setMap.add(5);
    console.log(setMap);//重复元素将不会被添加进来
}
{
    /*常用方法，has、add、clear、delete*/
    let set = new Set([1, 2, 3, 4, 4, 5]);//常用于数组去重等
    console.log(set.has(4), 'result:', set);//true
    console.log(set.delete(4), 'result:', set);
    console.log(set.clear(), 'result:', set);
}
{
    /*遍历*/
    let set = new Set(['a', 'b', 'c']);
    //可以用和数组的方式 :set.keys()[values(),entries()]
    for (let item of set) {
        console.log(item);
    }
    //也可以用set.forEach
    set.forEach(item => {
        console.log(item)
    });//箭头函数
    //相当于
    set.forEach(function (item) {
        console.log("f: ", item)
    });
}
{
    /*weakSet*/
    /*弱引用，当引用没有指向对象时，不会被垃圾回收机制处理*/
    /*存的东西只能是对象*/
}
{
    /*map*/
    /*map的key可以是任何类型*/
    let a = [1, 2];
    let b = {a: 1};
    let map = new Map();
    map.set(a, 'a');
    map.set(b, 'b');
    console.log(map);//Map(2) {Array(2) => "a", {…} => "b"}
    /*在初始化时可以这样添加数据*/
    let map2 = new Map([['a', 123], ['b', 456]]);
    console.log(map2);//Map(2) {"a" => 123, "b" => 456}
    /*其他的用法和遍历和set差不多*/

}

/*和Array的对比*/
{
    /*map和Array对比*：增删改查*/
    let map = new Map([['a', 'god'], ['b', 'dog']]);
    let array = [{'a': 'god'}, {'b': 'dog'}];
    //增
    map.set('c', 'cat');
    array.push({'c': 'cat'});
    console.log('add:', map, array);//Map(3) {"a" => "god", "b" => "dog", "c" => "cat"} Array(3)0: {"a" => "god"}1: {"b" => "dog"}2: {"c" => "cat"}length: 3 (3) [{…}, {…}, {…}]
    //删
    map.delete('c');
    let index = array.findIndex(item => item.c);//find和findIndex接受3中返回类型的函数，boolean、值、undefined,这里函数返回一个值，findIndex返回这个值对应数组的下标
    console.log(index);
    array.splice(index, 1);
    console.log('del', map, array);//Map(2) {"a" => "god", "b" => "dog"} Array(2) [{…}, {…}]
    //改
    map.set('b', 'dogv');
    array.forEach(item => item.b ? item.b = 'dogv' : false);
    console.log('modify: ', map, array);//Map(2) {"a" => "god", "b" => "dogv"}  (2) [{…}, {…}]
    //查
    let map_exit = map.has('a');
    let array_exit=array.find(item=>item.a);//find 返回这个值所属的对象整体
    console.log('find: ',map_exit,array_exit);//true {a: "god"}
}
{
    /*set和Array的对比*/
    /*跟map差不多，但是没有set方法，在数组中有对象时，数组存的只是对象的索引也就是堆地址*/
    let set=new Set([{a: 'a'},{b: 'b'}]);
    //删
    set.delete({a: 'a'});
    console.log(set);//Set(2) {{…}, {…}} 这样是删除不了的，delete({a: 'a'})中的{a: 'a'}和存储的引用不一样，是新在堆开辟的
    set.forEach(item=>item.a?set.delete(item):'nothing to do!');
    console.log(set);//Set(1) {{…}}
    //改
    set.forEach(item=>item.b?item.b='godlike':'什么也不做');
    console.log(set);//Array(1)0: value: {b: "godlike"}length: 1
    //查
    let result;
    set.forEach(item=>{
        let adress=item.b?item: '';
        result=set.has(adress);
    });
    console.log(result);//true
}
